<?php

/*
  Vamos a tener UNA SOLA caja grande en la cual se va a poder ingresar o retirar dinero de la misma
  a esta caja solo la va a ver un admin (lula)
  va a poder sacar dinero de una caja chica y pasarlo a la caja grande
  y viceverza tb
 */

class BigCashMovementsController extends AppController {

    var $name = 'BigCashMovements';
    var $uses = array('BigCashMovement', 'BigCash', 'Cash', 'CashMovement');

    function beforeFilter() {
        parent::beforeFilter();
        // Limito que si es un usuario del tipo user no pueda acceder
        $accion = $this->action;
        if ($this->Auth->user('group_id') != GROUP_ADMIN && !in_array($accion, array('importar_desde_caja_chica'))) {
            $this->Session->setFlash(__('Acceso Restringido', true));
            $this->redirect(array('controller' => 'futures', 'action' => 'index'));
        }
    }

    /*
      function index() {
      $this->CashMovement->recursive = 0;
      $this->set('cashMovements', $this->paginate());
      }
     */

    function view($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Movimiento inválido', true));
            $this->redirect(array('controller' => 'big_cashes', 'action' => 'view'));
        }
        $this->set('cashMovement', $this->BigCashMovement->read(null, $id));
    }

    function add() {
        if (!empty($this->data)) {

            //si es un movimiento de salida
            if ($this->data['BigCashMovement']['type'] == 'out') {
                if (!$this->BigCash->controlarPago($this->data['BigCashMovement']['amount'])) {
                    //si no alcanza la plata para pagar esto
                    $this->Session->setFlash(__('No hay dinero suficiente en la caja para retirar ese monto', true));
                    $this->redirect($this->referer());
                }
            }

            $this->BigCashMovement->create();
            if ($this->BigCashMovement->save($this->data)) {
                $this->Session->setFlash(__('El movimiento ha sido guardado.', true));
                $this->redirect(array('controller' => 'big_cashes', 'action' => 'view'));
            } else {
                $this->Session->setFlash(__('El movimiento no ha sido guardado. Por favor, intente nuevamente.', true));
            }
        }
        
        $this->set('options', array('simple' => 'Movimiento Simple'));
        $this->render('add');
    }

    /**
     * Función que genera un movimiento negativo en la caja chica del día actual, y ademas
     * generó un movimiento positivo en la caja grande del monto especificado
     * @param type $monto
     */
    function importar_desde_caja_chica() {
        //en la tabla big_cash_movements vamos a agregar un campo cash_id ( a parte del big_cash_id)
        //para registrar cuando hagamos una importacion de dinero de una caja chica a una grande, desde
        //donde proviene el dinero
        //hay que controlar que la caja chica actual tenga el monto suficiente para esto
        //agregar un registro del tipo IN en big_cash_movements
        //agregar un registro del tipo OUT en cash_movements
        //VER de agregar un campo a la tabla cash_movements para poder marcar aquellos movimientos
        //que son transacciones hacia o desde la caja grande. Para esto vamos a agregar un campo
        // "big_cash_movement_id" como para tener referencia a donde se mando o algo asi
        //busco la caja actual
        $cash = $this->Cash->getActual();
        $big_cash = $this->BigCash->getActual();

        if (!empty($this->data)) {

            //si es un movimiento de salida
            if ($this->data['CashMovement']['type'] == 'out') {
                if (!$this->Cash->controlarPago($this->data['CashMovement']['amount'])) {
                    //si no alcanza la plata para pagar esto
                    $this->Session->setFlash(__('No hay dinero suficiente en la caja para retirar ese monto', true));
                    $this->redirect($this->referer());
                }
            }

            //empiezo una transaccion
            $this->BigCashMovement->query('SET AUTOCOMMIT = 0;');
            $this->BigCashMovement->query('START TRANSACTION;');
            $bandera = true; //la uso para ver si algo salio mal

            //primero creamos el movimiento de salida en la caja chica actual
            $this->data['CashMovement']['cash_id'] = $cash['Cash']['id'];
            $this->CashMovement->create();
            if (!$this->CashMovement->save($this->data)) {
                $bandera = false;
            } else {
                //ahora creamos un movimiento del tipo "in" en la caja grande
                $big_cash_movement = array();
                $big_cash_movement['cash_id'] = $cash['Cash']['id'];
                $big_cash_movement['cash_movement_id'] = $this->CashMovement->id;
                $big_cash_movement['type'] = 'in';
                $big_cash_movement['movement'] = 'transfer_cash';
                $big_cash_movement['amount'] = $this->data['CashMovement']['amount'];
                $big_cash_movement['description'] = $this->data['CashMovement']['description'];

                $this->BigCashMovement->create();
                if (!$this->BigCashMovement->save($big_cash_movement)) {
                    $bandera = false;
                } else {
                    //por último actualizamos el campo del cash_movement_id para que
                    //quede relacionado con este último

                    $array_actualizar = array();
                    $array_actualizar['id'] = $this->CashMovement->id;
                    $array_actualizar['big_cash_movement_id'] = $this->BigCashMovement->id;
                    if (!$this->CashMovement->save($array_actualizar)) {
                        $bandera = false;
                    }
                }
            }

            if ($bandera) {
                $this->BigCashMovement->query('COMMIT;');
                $this->BigCashMovement->query('SET AUTOCOMMIT = 1;');
                $this->Session->setFlash(__('El movimiento ha sido guardado.', true));
                $this->redirect(array('controller' => 'cashes', 'action' => 'view'));
            } else {
                $this->Session->setFlash(__('El movimiento no ha sido guardado. Por favor, intente nuevamente.', true));
                $this->BigCashMovement->query('ROLLBACK;');
                $this->BigCashMovement->query('SET AUTOCOMMIT = 1;');
            }
        }

        $this->set('cash', $cash);
    }

    /**
     * Función que genera un movimiento negativo en la caja grande, y ademas
     * generó un movimiento positivo en la caja chica del día actual
     * del monto especificado
     */
    function exportar_hacia_caja_chica() {

        //busco la caja grande actual
        $big_cash = $this->BigCash->getActual();
        $cash = $this->Cash->getActual();

        if (!empty($this->data)) {

            //si es un movimiento de salida
            if ($this->data['BigCashMovement']['type'] == 'out') {
                if (!$this->BigCash->controlarPago($this->data['BigCashMovement']['amount'])) {
                    //si no alcanza la plata para pagar esto
                    $this->Session->setFlash(__('No hay dinero suficiente en la caja para retirar ese monto', true));
                    $this->redirect($this->referer());
                }
            }

            //empiezo una transaccion
            $this->BigCashMovement->query('SET AUTOCOMMIT = 0;');
            $this->BigCashMovement->query('START TRANSACTION;');
            $bandera = true; //la uso para ver si algo salio mal

            $this->data['BigCashMovement']['big_cash_id'] = $big_cash['BigCash']['id'];
            $this->data['BigCashMovement']['cash_id'] = $cash['Cash']['id'];

            $this->BigCashMovement->create();
            if (!$this->BigCashMovement->save($this->data)) {
                $bandera = false;
            } else {
                //ahora creamos un movimiento del tipo "in" en la caja chica actual
                $cash_movement = array();
                $cash_movement['cash_id'] = $cash['Cash']['id'];
                $cash_movement['big_cash_movement_id'] = $this->BigCashMovement->id;
                $cash_movement['type'] = 'in';
                $cash_movement['movement'] = 'transfer_cash';
                $cash_movement['amount'] = $this->data['BigCashMovement']['amount'];
                $cash_movement['description'] = $this->data['BigCashMovement']['description'];

                $this->CashMovement->create();
                if (!$this->CashMovement->save($cash_movement)) {
                    $bandera = false;
                }
            }

            if ($bandera) {
                $this->BigCashMovement->query('COMMIT;');
                $this->BigCashMovement->query('SET AUTOCOMMIT = 1;');
                $this->Session->setFlash(__('El movimiento ha sido guardado.', true));
                $this->redirect(array('controller' => 'big_cashes', 'action' => 'view'));
            } else {
                $this->Session->setFlash(__('El movimiento no ha sido guardado. Por favor, intente nuevamente.', true));
                $this->BigCashMovement->query('ROLLBACK;');
                $this->BigCashMovement->query('SET AUTOCOMMIT = 1;');
            }
        }

        $this->set('big_cash', $big_cash);
    }

    /**
     * Función para guardar pagos de señas de cumpleaños como depositos bancarios
     */
    function add_deposito() {
        if (!empty($this->data)) {

            $datos = $this->data['BigCashMovement'];
            $datos['type'] = 'in';
            $datos['movement'] = 'bank';

            $this->BigCashMovement->create();
            if ($this->BigCashMovement->save($datos)) {
                $this->Session->setFlash(__('El movimiento ha sido guardado.', true));
            } else {
                $this->Session->setFlash(__('El movimiento no ha sido guardado. Por favor, intente nuevamente.', true));
            }
            $this->redirect(array('controller' => 'jobs', 'action' => 'view', $datos['job_id']));
        } else {
            $this->redirect($this->referer());
        }
        
        $this->set('options', array('bank' => 'Depósito Cuenta Bancaria'));
        $this->render('add');
    }

}
